package com.example.test_1;

import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


/**
     数据储存
 下载文件需要保存到手机本地，比如壁纸应用
 应用的一些数据需要缓存，是否第一次启动应用，登陆页面是否记住密码等等

 文件储存：内部储存，外部储存
 内部储存，当app卸载的时候，数据会跟着被移除
 存储数据：openFileOutput
 读取数据：openFileIuput
 通过java流来读写这个数据，


 外部储存，当app被卸载的时候，数据任然存在,读写外部存储空间，需要向用户弹窗申请权限
 外部存储使用场景：
 图片、附件、视频以及其他的一些文件需要保存到手机本地
 外部存储需要判断外部存储状态，可用的情况下才能进行读写操作 调用api environment.getExternalStorageState然后得到state
 然后判断state是否是挂载（medium.mounted）

 */
public class MianDataStorage extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mian_data_storage);
    }

    //点击事件，在这里写入数据，调用api
    //openFileOutput指定参数，第一个参数是这个文件的名称，第二个是他的模式
    //3，openFileOutput报错需要抛出一个异常，抛在最外边throws FileNotFoundException
    //4.读取数据，write报错又需要抛出一个异常，那么可以抛一个最大的异常Exception
    //尽量用try，catch的方式抛出异常
    public void innerWrite(View view) {
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = openFileOutput("inner.txt", MODE_PRIVATE);
            fileOutputStream.write("hello,inner Storage".getBytes());
        } catch (FileNotFoundException e) {
            Log.e("FileNotFoundException", "File not found", e);
        } catch (IOException e) {
            Log.e("IOException", "Error reading file", e);
        } finally {
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                    Toast.makeText(this, "写入成功！！！", Toast.LENGTH_SHORT).show();
                } catch (IOException e) {
                    Log.e("IOException", "Error closing file", e);
                }
            }
        }


    }

    //内部读取openFileIuput
    public void innerRead(View view) throws Exception {
        FileInputStream fileInputStream = openFileInput("inner.txt");
        //读取的文件有多大，用到一个数组byte
        byte[] buffer = new byte[fileInputStream.available()];
        fileInputStream.read(buffer);
        //读取完后也需要关闭流
        fileInputStream.close();
        Toast.makeText(this, new String(buffer), Toast.LENGTH_SHORT).show();

    }


    //外部存储写入 1.首先判断这个外部存储是否挂载
    public void outerWrite(View view) throws Exception {
        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)){
            //写入数据
            File path = Environment.getExternalStorageDirectory();
            //创建外部存储的一个文件
            File file = new File(path,"outer.txt");
            //然后就可以开始写入了
            FileOutputStream fos = new FileOutputStream(file);
            fos.write("hshhhh".getBytes());
            fos.close();
            Toast.makeText(this, "写入成功！！！", Toast.LENGTH_SHORT).show();
        }
    }

    public void outerRead(View view) throws Exception {
        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)){
            //读取数据
            File path = Environment.getExternalStorageDirectory();
            File file = new File(path,"outer.txt");
            FileInputStream fileInputStream = new FileInputStream(file);
            byte[] buffer = new byte[fileInputStream.available()];
            fileInputStream.read(buffer);
            fileInputStream.close();
            Toast.makeText(this, new String(buffer), Toast.LENGTH_SHORT).show();
        }
    }
}